package keer.httpinterface.utils;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;

/**
 * 字符串处理工具了
 *
 * @author Keer
 * @since 1.0.0
 */
public final class StringUtils {
    private StringUtils() {

    }

    /**
     * 判断字符串是否为空
     * @param str 字符串
     * @return 字符串是否为空
     */
    public static boolean isEmpty(String str) {
        return str == null || str.isEmpty();
    }

    /**
     * 去掉字符串首尾的空白字符, 包括空格、制表符、换页符等,忽略字符串为空的情况
     * @param str 字符串
     * @return 去掉首尾空白字符的字符串
     */
    public static String trim(String str) {
        return str == null ? null : str.trim();
    }

    /**
     * 按分隔符分割字符串
     * @param str 字符串
     * @param separator 分隔符
     * @return 分割后的字符串数组
     */
    public static String[] split(String str, String separator) {
        return str == null ? null : str.split(separator);
    }

    /**
     * 连接字符串数组
     * @param separator 分隔符
     * @param strs 字符串数组
     * @return 连接后的字符串
     */
    public static String join(String separator, String... strs) {
        return String.join(separator, strs);
    }

    /**
     * 连接字符串数组
     * @param separator 分隔符
     * @param strs 字符串数组
     * @return 连接后的字符串
     */
    public static String join(String separator, Iterable<String> strs) {
        return String.join(separator, strs);
    }

    /**
     * 连接字符串数组, 并去除空白字符
     * @param separator 分隔符
     * @param strs 字符串数组
     * @param trim 是否去除空白字符
     * @return 连接后的字符串
     */
    public static String join(String separator, Iterable<String> strs, boolean trim) {
        return String.join(separator, strs).replaceAll("\\s+", "");
    }

    /**
     * 判断字符串是否为空白
     * @param str 字符串
     * @return 字符串是否为空白
     */
    public static boolean isBlank(String str) {
        return isEmpty(str) || str.trim().isEmpty();
    }

    /**
     * 转换为整数
     * @param str 字符串
     * @param defaultValue 默认值
     * @return 转换后的整数
     */
    public static Integer toInt(String str, Integer defaultValue) {
        if (isBlank(str)) {
            return defaultValue;
        }
        return Integer.parseInt(str);
    }

    /**
     * 将字符串转换为Double类型数值
     * 如果输入字符串为空或无法解析为Double类型，则返回默认值
     *
     * @param str 待转换的字符串
     * @param defaultValue 如果字符串为空或无法解析时返回的默认值
     * @return 转换后的Double类型数值或默认值
     */
    public static Double toDouble(String str, Double defaultValue) {
        // 检查字符串是否为空或只包含空白字符
        if (isBlank(str)) {
            // 如果字符串为空或只包含空白字符，则返回默认值
            return defaultValue;
        }
        // 尝试将字符串转换为Double类型数值并返回
        return Double.parseDouble(str);
    }
    /**
     * 将字符串转换为Long类型数字
     * 如果字符串为空或无法解析为Long类型，则返回默认值
     *
     * @param str 要转换的字符串
     * @param defaultValue 如果字符串为空或无法解析时返回的默认值
     * @return 转换后的Long类型数字或默认值
     */
    public static Long toLong(String str, Long defaultValue) {
        // 检查字符串是否为空或只包含空白字符
        if (isBlank(str)) {
            // 如果字符串为空，则返回默认值
            return defaultValue;
        }
        // 尝试将字符串转换为Long类型数字
        return Long.parseLong(str);
    }
    /**
     * 将字符串转换为Short类型值
     * 如果输入字符串为空或无法转换为Short类型，则返回默认值
     *
     * @param str 待转换的字符串
     * @param defaultValue 转换失败时的默认值
     * @return 转换后的Short类型值或默认值
     */
    public static Short toShort(String str, Short defaultValue) {
        // 检查字符串是否为空或只包含空白字符
        if (isBlank(str)) {
            // 如果是，则返回默认值
            return defaultValue;
        }
        // 如果字符串不为空且能正确转换为Short类型，则进行转换并返回
        return Short.parseShort(str);
    }
    /**
     * 将字符串转换为浮点数
     * 如果字符串为空或无法解析，则返回默认值
     *
     * @param str 要转换的字符串
     * @param defaultValue 如果转换失败时的默认值
     * @return 转换后的浮点数或默认值
     */
    public static Float toFloat(String str, Float defaultValue) {
        // 检查字符串是否为空或只包含空白字符
        if (isBlank(str)) {
            // 如果是，则返回默认值
            return defaultValue;
        }
        // 尝试将字符串转换为浮点数
        return Float.parseFloat(str);
    }
    /**
     * 将字符串转换为布尔值
     * 如果输入的字符串为空或非布尔格式，则返回默认值
     *
     * @param str 要转换的字符串
     * @param defaultValue 默认值，当字符串为空或无法解析时返回
     * @return 转换后的布尔值，如果无法解析则返回默认值
     */
    public static Boolean toBoolean(String str, Boolean defaultValue) {
        // 检查字符串是否为空或只包含空白字符
        if (isBlank(str)) {
            // 如果字符串为空或只包含空白字符，则返回默认值
            return defaultValue;
        }
        // 解析字符串为布尔值并返回
        return Boolean.parseBoolean(str);
    }
    /**
     * 将给定字符串按照指定字符集进行URL编码
     *
     * @param str 待编码的字符串
     * @param charset 字符集名称，如"UTF-8"
     * @return 编码后的字符串
     * @throws RuntimeException 如果指定的字符集不受支持，则抛出运行时异常
     */
    public static String urlEncode(String str,String charset) {
        try {
            // 使用URLEncoder进行URL编码
            return URLEncoder.encode(str, charset);
        } catch (UnsupportedEncodingException e) {
            // 捕获UnsupportedEncodingException并将其转换为RuntimeException
            throw new RuntimeException(e);
        }
    }
    /**
     * 将给定字符串转换为目标字符集
     * 此方法用于处理字符集转换，以便在不同的字符编码环境中正确显示文本
     *
     * @param str 待转换的字符串
     * @param targetCharset 目标字符集，例如 "ISO-8859-1" 或 "UTF-16"
     * @return 使用目标字符集编码的字符串
     * @throws RuntimeException 如果指定的字符集不受支持，则抛出运行时异常
     */
    public static String convertCharset(String str, String targetCharset) {
        // 检查输入字符串是否为空，空则直接返回null
        if (str == null) {
            return null;
        }
        // 如果目标字符集与默认字符集相同，则无需转换，直接返回原字符串
        if (ConstantUtils.DEFAULT_CHARSET.equals(targetCharset)) {
            return str;
        }
        try {
            // 将字符串按UTF-8字符集编码为字节数组，然后用目标字符集解码为字符串
            // 这样可以实现从任何字符集到目标字符集的转换
            return new String(str.getBytes(StandardCharsets.UTF_8), targetCharset);
        } catch (UnsupportedEncodingException e) {
            // 如果目标字符集不受支持，则包装异常并抛出
            throw new RuntimeException(e);
        }
    }
}
